#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 函数用于计算最长公共子序列的长度
int mostLong(int n, int a[], int b[]) {
    // 定义一维动态规划数组并初始化为 0
    vector<int> dp(n + 1, 0);
    for (int i = 1; i <= n; i++) {
        int prev = dp[0]; // 保存上一行的 dp[0]
        for (int j = 1; j <= n; j++) {
            int temp = dp[j]; // 保存当前的 dp[j]
            if (a[i] == b[j]) {
                dp[j] = prev + 1;
            } else {
                dp[j] = max(dp[j], dp[j - 1]);
            }
            prev = temp; // 更新 prev
        }
    }
    // 返回最终计算得到的最长公共子序列的长度
    return dp[n];
}

int main() {
    int n;
    cin >> n;
    int a[100007];
    int b[100007];
    // 读取第一个序列
    for (int i = 1; i <= n; i++) cin >> a[i];
    // 读取第二个序列
    for (int i = 1; i <= n; i++) cin >> b[i];
    // 调用 mostLong 函数计算最长公共子序列的长度
    int result = mostLong(n, a, b);
    // 输出结果
    cout << result << endl;
    return 0;
}